package com.gpj.learn.rabbitmq.ttl;

import com.gpj.learn.rabbitmq.common.CommonConstants;
import com.gpj.learn.rabbitmq.common.RabbitUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @className PubSubProducer
 * @description
 *   设置消息过期时间的方式 -- 使用TTL
 * @author GPJ
 * @date 2021/5/30 12:33
 * @version 1.0
 **/
@Slf4j
public class TTLMessageProducer {
	public static void main(String[] args) throws IOException {
		log.info("------------- 开始发送消息 -------------");
		Channel channel = RabbitUtil.createChannel();

		// 声明交换机
		channel.exchangeDeclare(
				CommonConstants.RABBITMQ_EXCHANGE_TTL,
				BuiltinExchangeType.DIRECT, // ttl交换机对类型没有要求
				false, // 是否持久化
				false, // 是否自动删除
				false, // 是否内置,true-内置交换机,客户端线程无法直接发送消息到该交换机上
				null); // 额外信息

		// 声明过期队列
		channel.queueDeclare(
				CommonConstants.RABBITMQ_QUEUE_TTL, // 队列名称
				false, // 是否持久化,false-不持久化
				false, // 是否队列私有化,false-非私有化,全部消费者均可消费;true-私有化,第一次拥有该队列的消费者才可以使用
				false, // 是否自动删除,false-连接停止之后不自动删除该队列
				null); // 额外参数

		// 绑定交换机
		channel.queueBind(
				CommonConstants.RABBITMQ_QUEUE_TTL, // 队列名
				CommonConstants.RABBITMQ_EXCHANGE_TTL, // 交换机名
				"test.ttl"); // 路由key


		AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("6000").build();
		String meaasge = "ttl message no.";
		channel.basicPublish(CommonConstants.RABBITMQ_EXCHANGE_TTL,
				"test.ttl", properties, (meaasge + 1).getBytes());
		RabbitUtil.close(channel);
		log.info("------------- 消息发送完成 -------------");
	}
}
